package main

import "fmt"

//Go语言本身，并不直接支持继承，但通过组合，可以实现继承的功能

type company struct {
	companyName string
	companyAddr string
}

type staff struct {
	name     string
	age      int
	position string
	company  //匿名字段，将company这个结构体，嵌入到staff中。类似staff 继承了company
}

//“父类”上的方法，“子类”也可以用
func (this company) getCompanyInfo() string {
	return fmt.Sprintf("公司信息:%s %s", this.companyName, this.companyAddr)
}

func (this company) getName() string {
	return "公司名称是：" + this.companyName
}

//方法重写，即多态
func (this staff) getName() string {
	return "员工姓名是：" + this.name
}

func main() {
	tecent := company{
		companyName: "腾讯",
		companyAddr: "深圳市南山区",
	}
	xiaoMin := staff{
		name:     "小明",
		age:      28,
		position: "测试工程师",
		company:  tecent,
	}
	fmt.Println(xiaoMin)
	fmt.Println(xiaoMin.company.companyName)
	fmt.Println(xiaoMin.companyName) //效果和上面一样
	fmt.Println(xiaoMin.getCompanyInfo())
	fmt.Println(tecent.getName())
	fmt.Println(xiaoMin.getName())         //优先调用子类方法
	fmt.Println(xiaoMin.company.getName()) //调用父类方法,不像php，没有parent关键字
}
